package com.whfc.iot.fse.lift.codec;

import com.whfc.iot.fse.lift.entity.LiftMsg0x10;
import com.whfc.iot.util.ByteUtil;
import com.whfc.iot.util.MsgDataCodecUtil;
import io.netty.buffer.ByteBuf;

import java.util.Date;

/**
 * @author sun_guodong
 * @description
 * @date 2021-05-28
 */
public class LiftMsgDataCodec0x10 implements LiftMsgDataCodec<LiftMsg0x10> {

    @Override
    public void decode(ByteBuf buf, LiftMsg0x10 msg) {
        // 读取硬件时间
        Date time = MsgDataCodecUtil.readDateTime(buf);

        // 实时起重量
        int weight = buf.readUnsignedShort();

        // 重量百分比
        int weightPercent = buf.readUnsignedByte();

        // 实时人数
        int personNo = buf.readUnsignedByte();

        // 实时高度
        int height = buf.readUnsignedShort();

        // 高度百分比
        int heightPercent = buf.readUnsignedByte();

        // 实时速度
        int speedBytes = buf.readUnsignedByte();
        // 大小
        int speed = ByteUtil.getBit(speedBytes, 6, 7);
        // 方向 0停止，1上下2下
        int direction = ByteUtil.getBit(speedBytes, 0);

        // 实时倾斜度1
        int dipAngle1 = buf.readUnsignedShort();

        // 倾斜百分比1
        int dipAngle1Percent = buf.readUnsignedByte();

        // 实时倾斜度2
        int dipAngle2 = buf.readUnsignedShort();

        // 倾斜百分比2
        int dipAngle2Percent = buf.readUnsignedByte();

        // 驾驶员身份认证结果
        int driverAuthResult = buf.readUnsignedByte();

        // 门锁状态
        int doorState = buf.readUnsignedByte();
        // 前门状态 0-关闭 1-开启
        int frontDoor = ByteUtil.getBit(doorState, 0);
        // 后门状态 0-关闭 1-开启
        int backDoor = ByteUtil.getBit(doorState, 1);
        // 门锁状态 0-无异常 1-异常
        int doorAlarm = ByteUtil.getBit(doorState, 2);

        // 系统状态
        int systemState = buf.readUnsignedShort();
        // 重量状态 0-正常 1-预警 2-报警
        int weightState = ByteUtil.getBit(systemState, 0, 1);
        // 高度限位 0-正常 1-预警 2-报警
        int heightState = ByteUtil.getBit(systemState, 2, 3);
        // 速度状态 0-正常 1-预警 2-报警
        int speedState = ByteUtil.getBit(systemState, 4, 5);
        // 人数 0-正常 1-预警 2-报警
        int personNoState = ByteUtil.getBit(systemState, 6, 7);
        // 倾斜 0-正常 1-预警 2-报警
        int dipState = ByteUtil.getBit(systemState, 8, 9);
        // 前门锁状态 0-正常 1-异常
        int frontDoorState = ByteUtil.getBit(systemState, 10);
        // 后门锁状态 0-正常 1-异常
        int backDoorState = ByteUtil.getBit(systemState, 11);
        // 风速报警状态 0表示正常，1表示预警，2表示报警
        int windSpeedState = ByteUtil.getBit(systemState, 12, 13);
        // 上限位状态 0表示正常，1表示报警
        int upState = ByteUtil.getBit(systemState, 14);
        // 防坠器状态 0表示正常，1表示报警
        int fallState = ByteUtil.getBit(systemState, 15);
        // 实时风速2byte
        int windSpeed = buf.readUnsignedShort();
        // 当前楼层2byte
        int floor = buf.readUnsignedShort();

        msg.setTime(time);
        msg.setBackDoorState(backDoorState);
        msg.setBackDoor(backDoor);
        msg.setDipAngle1(dipAngle1);
        msg.setDipAngle1Percent(dipAngle1Percent);
        msg.setDipAngle2(dipAngle2);
        msg.setDipAngle2Percent(dipAngle2Percent);
        msg.setDipState(dipState);
        msg.setDirection(direction);
        msg.setDoorAlarm(doorAlarm);
        msg.setDriverAuthResult(driverAuthResult);
        msg.setFrontDoor(frontDoor);
        msg.setFrontDoorState(frontDoorState);
        msg.setHeight(height);
        msg.setHeightPercent(heightPercent);
        msg.setHeightState(heightState);
        msg.setPersonNo(personNo);
        msg.setPersonNoState(personNoState);
        msg.setSpeed(speed);
        msg.setSpeedState(speedState);
        msg.setWeight(weight);
        msg.setWeightPercent(weightPercent);
        msg.setWeightState(weightState);
        msg.setWindSpeed(windSpeed);
        msg.setFloor(floor);
        msg.setWindSpeedState(windSpeedState);
        msg.setUpState(upState);
        msg.setFallState(fallState);
    }
    /**  网畅   命令字0X10 数据格式
     *     a5 5a         帧头（2byte）
     *     10            帧类型（1byte）
     *     00            塔吊编号（1byte）
     *     b9 18 21       设备编号（3byte）
     *======================信息体
     *                     16 05 10 0b 1f 22
     *                     00 00
     *                     00
     *                     00
     *                     00 00
     *                     00
     *                     00
     *                     05 dc
     *                     00
     *                     05 dc
     *                     00
     *                     00
     *                     00
     *                     04 00
     *                     00 00
     *                     00 01
     *=====================
     *     3f              和校验（1byte）
     *     23              长度（1byte）
     *     cc 33 c3 3c     帧尾部（4byte）
     */
}
